﻿using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public sealed class EventMa : Singleton<EventMa>
{

    private EventMa() { }

    public delegate void EventHandler(params object[] args);

    private Dictionary<EGameEvent, Dictionary<EventHandler, object[]>> _Events = new Dictionary<EGameEvent, Dictionary<EventHandler, object[]>>();

    // 发送事件
    public void notify(EGameEvent id, params object[] args)
    {
        if (!_Events.ContainsKey(id))
            return;

        //迭代器会有问题，如果再执行事件的时候，执行的事件要移除通知，会出现异常，采用for
        //        foreach (KeyValuePair<EventHandler, object[]> handlerInfo in _Events[id])
        //        {
        //            object[] tempArgs = new object[handlerInfo.Value.Length + args.Length];
        //            handlerInfo.Value.CopyTo(tempArgs, 0);
        //            args.CopyTo(tempArgs, handlerInfo.Value.Length);
        //
        //            handlerInfo.Key(tempArgs);
        //        }

        //解决如上问题
        Dictionary<EventHandler, object[]> tmp = _Events[id];
        EventHandler[] handlerArr = new EventHandler[tmp.Count];

        tmp.Keys.CopyTo(handlerArr, 0);

        for (int i = 0; i < handlerArr.Length; i++)
        {
            object[] tempArgs = new object[tmp[handlerArr[i]].Length + args.Length];
            tmp[handlerArr[i]].CopyTo(tempArgs, 0);
            args.CopyTo(tempArgs, tmp[handlerArr[i]].Length);

            handlerArr[i](tempArgs);
        }

    }

    // 注册事件
    public bool register(EGameEvent id, EventHandler handler, params object[] args)
    {
        if (id <= EGameEvent.ET_Null || handler == null)
            return false;

        Dictionary<EventHandler, object[]> handlerInfo = null;
        if (_Events.ContainsKey(id))
        {
            handlerInfo = _Events[id];
        }
        else
        {
            handlerInfo = new Dictionary<EventHandler, object[]>();
            _Events.Add(id, handlerInfo);
        }

        if (handlerInfo.ContainsKey(handler))
        {
            PLDebug.LogError("Register event:[" + id.ToString() + "] repeated!");
            return false;
        }

        handlerInfo.Add(handler, args);

        return true;
    }

    // 注销事件
    public bool unregister(EGameEvent id, EventHandler handler)
    {
        if (!_Events.ContainsKey(id))
            return false;

        Dictionary<EventHandler, object[]> handlerInfo = _Events[id];
        if (!handlerInfo.ContainsKey(handler))
            return false;

        handlerInfo.Remove(handler);

        if (handlerInfo.Count == 0)
            _Events.Remove(id);

        return true;
    }

    public bool unregister(EGameEvent id)
    {
        if (!_Events.ContainsKey(id))
            return false;

        Dictionary<EventHandler, object[]> handlerInfo = _Events[id];
        handlerInfo.Clear();
        _Events.Remove(id);
        return true;
    }
}

public enum EGameEvent
{
    ET_Null = 0,  // 无法发送
    ET_Test = 1,  // 测试消息

    ET_AttrRoleChanged = 100,       // 人物属性发生变化
    ET_AttrFightInit,
    ET_AttrFightChanged,            // 战斗属性发生变化
    ET_AttrRoleBaseAttrChanged,     // 主角基本属性
    ET_SelectedRole,                // 选中目标
    ET_SkillHit,                    // 技能击中
    ET_BuffChanged,                 // Buff改变	

    ET_OnResUpdated,                // 资源更新完毕
    ET_OnSceneLoaded = 150,         //场景加载完毕
    ET_OnPlayerEnterScene = 151,    // 玩家进入场景
    ET_OnCloseNpcDialog = 152,         // 结束NPC对话
    ET_OnAttackModeChange = 153,         // 改变攻击模式
    ET_OnGetChatMsg = 154,              //收到聊天消息
    ET_OnPlayerUnlock = 155,

    ET_ItemAdded = 200,
    ET_ItemRemoved = 201,
    ET_ItemCd = 202,                // 道具CD时间到了
    ET_ItemStartCd = 203,           // 道具开始时间
    ET_NewItemAdd = 204,            // 新道具添加
    ET_ItemUpdate = 205,
    ET_ItemAllDelete = 206,            //删除全部道具

    ET_WarehouseOpen = 250,         // 仓库打开
    ET_WarehouseClose = 251,        // 仓库关闭

    ET_TAO = 350,                   //道行值更新
    ET_Realm = 351,                 //境界UI更新
    ET_RealmChange = 352,           //境界提升
    ET_StarChange = 353,            //星位开启
    ET_SpellLvUp = 354,             // 技能升级
    ET_SpellLearn = 355,            // 技能学习
    ET_SpellEquipItem = 356,        // 装备技能书
    ET_EquipForgeOperation = 357,
    ET_PrestigeChange = 358,

    ET_QuestChanged = 400,          // 任务信息变化
    ET_QuestDone,                   // 任务信息变化
    ET_QuestChapterChanged,         // 任务章节信息变化
    ET_QuestListChanged,            // 进行中的任务信息变化
    ET_RolePromptSkill,             // 提示角色技能
    ET_QuestAccept,                 // 接受任务

    ET_Login = 450,                 //人物登录
    ET_ServerUIChange,              //连接服务器界面
    ET_DelRole,                    //删除角色
    ET_Input,                      //触碰
    ET_Team,                       //队伍
    ET_Report,                     //捷报
    ET_Margic,                     //法宝
    ET_Error,
    ET_NearbyPlayer,              //附近的人
    ET_FightChange,                //战斗力改变
    ET_AihChange,                   //心意值改变
    ET_SchoolInvite,               //门派邀请
    ET_OnQueneRoom,                 //更新房间排队信息
    ET_OnReadyRoom,                 //更新房间准备信息
    ET_OnPlayerReady,               //玩家准备完成
    ET_OnQuitRoom,                  //退出排队房间
    ET_NewRedMsg,                   //提示玩家有新东西,图标上显示小红点
    ET_SetMount,                   //提示玩家有新东西,图标上显示小红点
    ET_UIOpen,                      //打开UI
    ET_UIClose,                     //关闭UI
    ET_FirstEnterGame,              //创建角色后进入游戏（第一次进入游戏）
    ET_ShowRedMsg,
    ET_BuyChargeSuccess,
    ET_GetFirstChargeSuccess,
    ET_OpenCharge,
    ET_BagInited,
    ET_CopyTime,
    ET_FuncOpen,//新功能开放



    ET_StartLoadScene,
    ET_EndLoadEndScene

}

